SecuriryGroup ルールの一覧をどうしても表計算ソフトに貼り付けたいのでマネジメントコンソールから CSV でエクスポートする
コンバンハ、千葉(幸)です。
SecuriryGroup のルール一覧を Excel に貼り付けてチェックしたい、皆さんもそんな思いに駆られることもあるのではないでしょうか。(Excel でなく Google スプレッドシートやその他もろもろの表計算ソフトでも構わないので、そこは本筋ではありません。)
初めましての環境での設定値チェック、あるいは構築した環境でのダブルチェックなど、いまある SecuriryGroup ルールの一覧を手元で確認したいというケースを想定しています。
「マネジメントコンソールで全選択してスプレッドシートに値のみ貼り付けをしたのち、ズレた部分を手動で整える」という漢気溢れる手法でも実現できなくもないですが、なるべくならここで漢気は出したくありません。
- SecuriryGroup の一覧を表示する
- 一つの SecuriryGroup の詳細を表示する
- インバウンドルールのタブを選択する
- アウトバウンドルールのタブを選択する
- 次の SecuriryGroup の詳細を表示する……
という手順が必要になることを考えると、漢気の在庫が早々に枯渇しそうです。
一昔前はこんな場合に取りうる手段は少なかったのですが、今ではマネジメントコンソールからの CSV でのエクスポートという便利な手段が用意されています。
その使い心地を確認しつつ、AWS CLI での出力も合わせて確認してみます。
まとめ
- SecuriryGroup の一覧、SecuriryGroup のルール一覧はマネジメントコンソールから CSV でエクスポートできる
aws ec2 describe-security-group-rules
で似たようなことができるので項目をカスタマイズしたければこちらを使うのもあり
SecuriryGroup をマネジメントコンソールから CSV でエクスポートする
マネジメントコンソールの「EC2」もしくは「VPC」のサービス画面から SecuriryGroup の一覧を参照できます。そのいずれにおいても「セキュリティグループを CSV にエクスポート」というボタンが用意されています。
ボタンの横の「▼」を押下することで、以下のいずれかの操作を選択できます。
- セキュリティグループを CSV にエクスポート
- セキュリティグループのインバウンド / アウトバウンドルールを CSV にエクスポート
いずれも、対象は画面下部で選択した(チェックボックスでチェックが入った) SecuriryGroup となります。
SecuriryGroup 一覧のエクスポート
「セキュリティグループを CSV にエクスポート」から出力した結果のイメージは以下です。
列の一覧は以下の通りであり、これはカスタマイズできません。
- GroupId(セキュリティグループ ID)
- GroupName(セキュリティグループ名)
- VpcID(セキュリティグループが所属する VPC ID)
- Description(セキュリティグループの説明)
- OwnerId(セキュリティグループを所有する AWS アカウント)
- InboundRulesCount(インバウンドルール数)
- OutboundRulesCount(アウトバウンドルール数)
- Tags(セキュリティグループに付与されたタグ一覧)
Tags は以下の形式で記載されています。
<タグキー1>:<値>,<タグキー2>:<値>,<タグキー3>:<値>... (例) Name:TestSG,Description:SG for Test,aws:cloudformation:stack-name:TestStack...
タグキーに:
が含まれることもあるため、分割するときは注意が必要そうです。
SecuriryGroup ルール一覧のエクスポート
「セキュリティグループのインバウンド / アウトバウンドルールを CSV にエクスポート」から出力した結果のイメージは以下です。
列の一覧は以下です。同じくカスタマイズはできません。
- GroupId(セキュリティグループ ID)
- GroupName(セキュリティグループ名)
- Type(インバウンド/アウトバウンドのタイプ)
- IpProtocol(IP プロトコル。
-1
は「すべて」を表す) - FromPort(ポート範囲の開始)
- ToPort(ポート範囲の終了)
- IpRanges(IPv4 の IP 範囲)
- Ipv6Ranges(IP v6 の IP 範囲)
- PrefixListIds(プレフィックスリスト ID)
- UserIdGroupPairs(相互参照するセキュリティグループ ID)
相互参照とはインバウンドにおける送信元、アウトバウンドにおける宛先として SecuriryGroup を指定することを指します。この CSV では相互参照先の セキュリティグループ名が表示されないため、スプレッドシートの VLOOKUP 関数を使用するなどして表示を工夫するとよいでしょう。
AWS CLI でルール一覧を出力する
ここまで確認した CSV の内容で多くのケースでは事足りるかと思います。とは言えもう少し項目をカスタマイズしたい、というケースもあるかもしれません。
特に SecuriryGroup ルール一覧の CSV はマネジメントコンソールでは参照できる「ルール ID」と「説明」が含まれていないため、この値を取りたいんだということもあるでしょう。そんな時には以下の AWS CLI コマンドを使用します。
以下の AWS CLI バージョンを使用して試してみます。
% aws --version aws-cli/2.4.6 Python/3.8.8 Darwin/20.6.0 exe/x86_64 prompt/off
ルールごとに ID が採番されるようになったのが 2021年7月のため、それ以降の AWS CLI のバージョンであればコマンドは実行できるかと思います。
JSON 出力のイメージ
特にフィルター等を使用せずそのまま JSON で出力した際のイメージは以下です。
% aws ec2 describe-security-group-rules --output json { "SecurityGroupRules": [ { "SecurityGroupRuleId": "sgr-0f6931da807969f7c", "GroupId": "sg-0e397fe90b00bc997", "GroupOwnerId": "000000000000", "IsEgress": true, "IpProtocol": "-1", "FromPort": -1, "ToPort": -1, "CidrIpv4": "0.0.0.0/0", "Description": "hoge" "Tags": [] }, { "SecurityGroupRuleId": "sgr-0a8e56cc225ec542a", "GroupId": "sg-0bd23967c75e01f7d", "GroupOwnerId": "000000000000", "IsEgress": false, "IpProtocol": "-1", "FromPort": -1, "ToPort": -1, "ReferencedGroupInfo": { "GroupId": "sg-0bd23967c75e01f7d", "UserId": "000000000000" }, "Tags": [] }, .....
相互参照の SecuriryGroup がある場合はReferencedGroupInfo
の配下に記載されますが、それ以外の情報は同列で出力されます。
また、インバウンド/アウトバウンドルールのいずれであるかはIsEgress
で表されます。false
であればインバウンドルール、true
であればアウトバウンドルールです。
テキスト出力のイメージ
出力形式としてtext
を指定して実行してみます。以下のようにタブで区切られた結果が得られます。
% aws ec2 describe-security-group-rules --output text SECURITYGROUPRULES 0.0.0.0/0 -1 sg-0e397fe90b00bc997 000000000000 -1 True sgr-0f6931da807969f7c -1 SECURITYGROUPRULES -1 sg-0bd23967c75e01f7d 000000000000 -1 False sgr-0a8e56cc225ec542a -1 REFERENCEDGROUPINFO sg-0bd23967c75e01f7d 000000000000 SECURITYGROUPRULES -1 sg-04b167c5ccef42abc 000000000000 -1 False sgr-06535b8cc75681639 -1 REFERENCEDGROUPINFO sg-0a597e5b2a9a1d86d 000000000000 SECURITYGROUPRULES 0.0.0.0/0 80 sg-0e397fe90b00bc997 000000000000 tcp False sgr-02ceec822ac63ab5c 80 SECURITYGROUPRULES 0.0.0.0/0 -1 sg-00f6367024c9125ff 000000000000 -1 True sgr-0bb5823aacbd86ad4 -1 SECURITYGROUPRULES 443 sg-02d9d038b65bf387a 000000000000 tcp False sgr-0d9a25d881c4d1dac 443 REFERENCEDGROUPINFO sg-0a597e5b2a9a1d86d 000000000000 SECURITYGROUPRULES 0.0.0.0/0 -1 sg-04f8fc8a14ea3c852 000000000000 -1 True sgr-0e8fdc3a62ae87a13 -1 SECURITYGROUPRULES 0.0.0.0/0 -1 sg-0a597e5b2a9a1d86d 000000000000 -1 True sgr-04ca7c64f6d9f8d72 -1 SECURITYGROUPRULES ::/0 -1 sg-074c66a9ced2409f3 000000000000 -1 True sgr-07a28cd5d0eb52d6d -1 ...
行ごとにSECURITYGROUPRULES
とREFERENCEDGROUPINFO
のいずれを示すかが表されており、それぞれの行の内訳を確認すると以下のようになっていました。
SECURITYGROUPRULES の行
行ごとに以下の内容がタブ区切りで出力されています。
- CidrIpv4
- CidrIpv6
- Description
- FromPort
- GroupId
- GroupOwnerId
- IpProtocol
- IsEgress
- SecurityGroupRuleId
- ToPort
マネジメントコンソールからエクスポートした CSV ではFromPort
とToPort
に-1
が入るのは ICMP ルールの場合のみでしたが、ここではタイプが「すべてのトラフィック」の場合でも-1
が入ります。 TCP や UDP の場合、0 - 65535
で表されます。
REFERENCEDGROUPINFO の行
該当行では以下の内容が出力されていました。
- GroupId
- UserId
GroupId
はあくまで相互参照先の SecuriryGroup ID を表すものなので、この行だけだとどの SecuriryGroup ルール ID に紐づく情報なのかが判別できませんね。
それぞれの結果を確認し、出力に含まれる項目がアルファベット順でソートされていることが分かりました。今回試行した環境ではPrefixListId
やVpcPeeringConnectionId
等を持つルールがありませんでしたが、それらがあればさらに列が増えて出力されます。
クエリを指定して項目を絞り込んで出力する
列がソートされてしまうと分かりづらいのと、すべての項目の出力は必要ないということで--query
でフィルタリングしてみます。
% aws ec2 describe-security-group-rules\ --query 'SecurityGroupRules[*].[ GroupId, SecurityGroupRuleId, IsEgress, IpProtocol, FromPort, ToPort, CidrIpv4, CidrIpv6, ReferencedGroupInfo.GroupId, Description ]'\ --output text sg-0e397fe90b00bc997 sgr-0f6931da807969f7c True -1 -1 -1 0.0.0.0/0 None None None sg-0bd23967c75e01f7d sgr-0a8e56cc225ec542a False -1 -1 -1 None None sg-0bd23967c75e01f7d None sg-04b167c5ccef42abc sgr-06535b8cc75681639 False -1 -1 -1 None None sg-0a597e5b2a9a1d86d None sg-0e397fe90b00bc997 sgr-02ceec822ac63ab5c False tcp 80 80 0.0.0.0/0 None None None sg-00f6367024c9125ff sgr-0bb5823aacbd86ad4 True -1 -1 -1 0.0.0.0/0 None None None sg-02d9d038b65bf387a sgr-0d9a25d881c4d1dac False tcp 443 443 None None sg-0a597e5b2a9a1d86d None sg-04f8fc8a14ea3c852 sgr-0e8fdc3a62ae87a13 True -1 -1 -1 0.0.0.0/0 None None None sg-0a597e5b2a9a1d86d sgr-04ca7c64f6d9f8d72 True -1 -1 -1 0.0.0.0/0 None None None sg-074c66a9ced2409f3 sgr-07a28cd5d0eb52d6d True -1 -1 -1 None ::/0 None None sg-0bfa10eac66ac1610 sgr-08ec2d511f3c0d02c True -1 -1 -1 0.0.0.0/0 None None None
指定した通りの列順で出力されました。該当する値がない箇所はNone
と表示されます。
結果を適当なファイルに出力する、Mac であればパイプでpbcopy
でクリップボードにコピーする、などしてスプレッドシートに転記すると、以下のように表示されます。
- ヘッダーが無いので自分でつけてあげる必要がある
- セキュリティグループ ID がバラバラで出てくるので並び替えが必要
- セキュリティグループ名が結果に含まれていないのでどこかから引っ張ってくる必要がある
など課題はいくつかありますが、スプレッドシートなのでいくらでもやりようはあります。お好みの方法でいじくり回してください。
終わりに
SecuriryGroup ルールをまとめてチェックしたい時はなんやかんや表計算ソフト一番だよな(※個人の感想です)、という話でした。
マネジメントコンソールから CSV でエクスポートできるようになった明確な時期は定かではありませんが、2021年11月ごろだったかと記憶しています。大抵の場合はこの CSV で事足りるかと思うものの、物足りない場合は AWS CLI もご活用ください。
今回試したのはルール単位での出力です。SecuriryGroup 単位での一覧を出力したい場合は以下コマンドを使うことになります。
CSV 出力できるようになったのが2021年11月ごろ(想定)、ルール単位での AWS CLI 出力ができるようになったのが 2021 年7月ごろだと考えると、それ以前はaws ec2 describe-security-groups
をうまくいじくり回してあげないと手元での確認が気軽にはできなかったということですね。いい時代になりました。
SecuriryGroup は何かとチェックする機会が多い項目だと思いますので、本エントリが参考になれば幸いです。
以上、 チバユキ (@batchicchi) がお送りしました。